package thread;
import org.omg.PortableServer.THREAD_POLICY_ID;
/**
 * 线程提供了一个方法：
 * void join（）
 * 该方法允许调用这个方法的线程在该方法所属线程上等待（阻塞），直到该方法所有属性线程结束后才会解除
 * 等待继续后续的工作，所以join方法可以用来协调线程的同步运行
 *
 * 同步运行：多个线程执行过程存在先后顺序进行。
 * 异步运行：多个线程各干各的，线程本来就是异步运行的。
 *
 */
public class JoinDemo {
    private  static  boolean isFinish=false;//表示图片是否 下载完毕
    public static void main(String[] args) {
        // boolean isFinish=false;//当一个方法的局部内部类引用这个方法的其他局部变量时，
        // 这个变量必须要final的， 这是由于JVM内存分配问题导致的，当成语法要求去遵循即可。
        //因此被局部内部引用的局部变量是不能被2次赋值的。
        Thread downloand=new Thread(){
            public void run(){
                System.out.println("dow：开始下载图片");
                for (int i = 0; i <101 ; i++) {
                    System.out.println("down："+i+"%");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                    }
                }
                System.out.println("down：图片下载完毕！");
                isFinish=true;
            }
        };
        Thread show=new Thread(){
            public void run(){
                try {
                    System.out.println("开始显示文字......");
                    Thread.sleep(3000);
                    System.out.println("show：显示文字完毕！");
                    //将show线程阻塞，等待download线程执行完毕在后续操作！
                    System.out.println("show：等待download下载图片.....");
                      downloand.join();
                    System.out.println("show：等待完毕！");

                     System.out.println("show：开始显示图片.....");
                    if (!isFinish){
                        //当一个线程的run方法抛出一个异常，则会线程结束！
                        throw new RuntimeException("图片加载失败！");
                    }
                    System.out.println("show：图片显示完毕！");
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
            }
        };
        downloand.start();
        show.start();
    }
}
